home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_08 / 9n08012b < prev    next >
Text File  |  1991-07-08  |  2KB  |  57 lines

  1. /* _Dint function -- IEEE 754 version */
  2. #include "xmath.h"
  3.  
  4. short _Dint(double *px, short xexp)
  5.         {       /* test and drop (scaled) fraction bits */
  6.         unsigned short *ps = (unsigned short *)px;
  7.         unsigned short frac = ps[_D0] & _DFRAC
  8.                 || ps[_D1] || ps[_D2] || ps[_D3];
  9.         short xchar = (ps[_D0] & _DMASK) >> _DOFF;
  10.  
  11.         if (xchar == 0 && !frac)
  12.                 return (0);     /* zero */
  13.         else if (xchar != _DMAX)
  14.                 ;       /* finite */
  15.         else if (!frac)
  16.                 return (INF);
  17.         else
  18.                 {       /* NaN */
  19.                 errno = EDOM;
  20.                 return (NAN);
  21.                 }
  22.         xchar = (_DBIAS+48+_DOFF+1) - xchar - xexp;
  23.         if (xchar < 0)
  24.                 return (0);     /* no frac bits to drop */
  25.         else if ((48+_DOFF)  xchar)
  26.                 {       /* all frac bits */
  27.                 ps[_D0] = 0, ps[_D1] = 0;
  28.                 ps[_D2] = 0, ps[_D3] = 0;
  29.                 return (FINITE);
  30.                 }
  31.         else
  32.                 {       /* strip out frac bits */
  33.                 static const unsigned short mask[] = {
  34.                         0x0000, 0x0001, 0x0003, 0x0007,
  35.                         0x000f, 0x001f, 0x003f, 0x007f,
  36.                         0x00ff, 0x01ff, 0x03ff, 0x07ff,
  37.                         0x0fff, 0x1fff, 0x3fff, 0x7fff};
  38.                 static const size_t sub[] = {_D3, _D2, _D1, _D0};
  39.  
  40.                 frac = mask[xchar & 0xf];
  41.                 xchar >>= 4;
  42.                 frac &= ps[sub[xchar]];
  43.                 ps[sub[xchar]] ^= frac;
  44.                 switch (xchar)
  45.                         {       /* cascade through! */
  46.                 case 3:
  47.                         frac |= ps[_D1], ps[_D1] = 0;
  48.                 case 2:
  49.                         frac |= ps[_D2], ps[_D2] = 0;
  50.                 case 1:
  51.                         frac |= ps[_D3], ps[_D3] = 0;
  52.                         }
  53.                 return (frac ? FINITE : 0);
  54.                 }
  55.         }
  56.  
  57.